#ifndef __DI_TEST_H__
#define __DI_TEST_H__
#include <stdint.h>
#include <limits.h>
#include "thread_ctrl.h"

#define DI_ITEM_NAME            "DI"
#define DI_ITEM_NUM             (1 + 2)
#define DI_MODULE_NUM           1
#define DI_ARGV_OFFSET          2
#define DI_DRV_NAME             "pcie_di"
#define DI_MAX_NUM              32

enum di_mode {
    DI_MOD_LEVEL        = 0,                /* 电平状态检测 */
    DI_MOD_IRQ          = 1,                /* 中断模式 */
};

enum di_edge {
    DI_EDGE_FALL        = 0,                /* 下降沿 */
    DI_EDGE_RISE        = 1,                /* 上升沿 */
    DI_EDGE_RISE_FALL   = 2,                /* 上升和下降沿 */
};

/* DI 设备 */
struct di_dev_t {
    void *parent;                           /* 父指针 */
    char name[32];                          /* 设备名 */
    uint8_t index;                          /* 索引号 */

    uint8_t mode;                           /* 模式 */
    uint8_t edge;                           /* 边沿 */
    uint16_t delay;                         /* 延时时间, us */
    uint32_t level;                         /* 电平 */

    char path[PATH_MAX];                    /* 路径 */
    int fd;                                 /* 文件 */
    struct thread_param_t *read_thread;     /* 接收线程 */
};

/* DI 信息 */
struct di_param_t {
    void *parent;                           /* 父指针 */
    char name[32];                          /* 设备名 */
    uint8_t dev_id;                         /* 设备索引号 */
    uint8_t dev_num;                        /* 设备数量 */
    uint8_t max_num;                        /* 最大数量 */
    uint8_t type;                           /* 模块类型 */

    struct di_dev_t *dev;                   /* DI 设备 */
    uint32_t level;                         /* DI 当前电平 */

    uint8_t item_id;                        /* 测试项目号 */
    uint8_t en_read;                        /* 使能接收 */
    int read_cnt;                           /* 接收数量 */
};

struct di_item_t {
    struct thread_info_t *thread;
    struct di_param_t *param;
};

int di_test(int argc, char *argv[]);

#endif /* __DI_TEST_H__ */
